整体来看,评价模型的求解对编程的要求不大,但熟练掌握编程操作也会节省不少时间。 我们可以将输入的数据视为一个表格(每一行row代表一个工作,每一列column代表工作的一种属性;或者行列颠倒过来),数学上来看就是一个大的“矩阵”matrix。我们要做的是对数据进行行列变换,相当于对矩阵进行运算。
评价模型需要运算的环节主要包括
一致化处理主要就是是将极小型、居中型、区间型指标转换为极大型指标,其中涉及分段函数的设计(针对居中型和区间型)、取倒数和相反数(对极小型指标),接下来就是对不同列的属性值进行转换即可。如果用Excel来做,设计好函数之后拖拽公式即可实现批量化处理,对于Python而言主要用到Numpy库和Pandas库(二者取其一就行),然后利用库自带函数并结合矩阵运算即可求解。
归一化处理包含极差归一化、向量归一话、标准化、比例归一化等处理方法,运算的函数包括求模长或距离(针对向量归一话)用到根式、求z分数(针对标准化,用到样本均值、方差)等,难度稍稍高于一致化处理,可以使用Python中Numpy库的linalg.norm
np.mean
np.std
等方法,这些都是库中自带的函数,用起来比较方便;当然同学们自己去写函数也不困难,但或许没有必要。
权重计算的函数相对比较复杂,可以视为评价模型中计算最困难的部分了,但相比其他类模型而言,也还是简单。以熵权法的权重公式为例,需要用到熵值函数 $$Entropy(p) = -p\ln p$$ 也要注意要确保p不为零。如果p为0,可以设置函数值也为0,或者将0改写为一个极小的数如0.000001,函数值也接近于零。
层次分析法需要用到线性代数中的特征值、特征向量的知识,虽然使用Numpy运算也仅仅是一行代码的问题,但这个概念对大部分高中生、初中生而言是没有接触过的,理解起来需要时间,将它清晰地在论文中表述出来也是一个挑战。特征值与特征向量的定义:
$$AX=\lambda X$$
其中$A$是判断矩阵,$X$是特征向量,$\lambda$是特征值。使用Numpy中的linalg.eig
函数即可算出。重点还是掌握该权重的求解思路。
当然还有其他求权重方法,如CRITIC等方法,运算量更大,不过类似方法在近些年O奖论文中也没大出现过。
综合的方法主要有线性加权、指数加权、对数加权等,所不同的就是权重所在的位置,如线性加权 $$\sum_{i=1}^{m}w_ix_i$$ 是将权重作为指标的系数。指数加权 $$\prod_{i=1}^{m}w_ix_i$$ 是将权重放在指标的指数上。
用的最多的是线性加权的方法,运算的原理是矩阵的乘法,不过不用矩阵求法,当样本数量不多时逐个计算也不困难。Python中可以使用Numpy的dot
函数或者@
矩阵乘法运算符。
评价模型计算这里对于大部分学习过数学建模的同学而言不是难点,同学解决问题过程的重心会放在创新模型及统计模型的地方。编程这里同学熟悉Python基本的Numpy库或Pandas即可,当然如果模型中含有其他类别的模型,那还需要对其他模型的相关编程求解知识,那就具体问题具体分析。
import numpy as np
A = np.identity(5)
np.linalg.norm(A)
2.23606797749979